JOANNEUMHomeForschungsbereicheNeuSite MapRESEARCH      englishsuchenHilfe

vorheriges Kapitel Inhalt Hilfe Beispiele laden nächstes Kapitel

Sprachbestandteile von VBA

In diesem Kapitel werden vorgestellt:
  • Prozeduren
  • Funktionen
  • Anweisungen
  • Variablen und Datentypen
  • Konstanten
  • Datenfelder
  • Operatoren
  • Objekte
  • Gültigkeitsbereiche

Wir wollen in diesem Kapitel einen geordneten Überblick über das geben, was VBA ausmacht. Als Ausgangspunkt wollen wir wieder unser kleines VBA-Programm verwenden:

Sub Hauptprozedur()
Wert1=5
Wert2=12
Produkt=Wert1 * Wert2
End Sub


Was Sie hier sehen, heißt in VBA eine "Prozedur".

Prozeduren

Eine Prozedur ist eine selbständige Einheit von Anweisungen, die ("Argumente") erhalten, eine Reihe von Anweisungen ausführen und die Werte der übergebenen Argumente ändern kann. Die Prozedur ist die kleinste selbständige Einheit eines VBA-Programmes. Sie beginnt mit dem Text

Sub 


plus einem Namen. Dieser Name darf auf einem Modulblatt nur ein einziges Mal zum Bezeichnen einer Prozedur verwendet werden.

Am Ende jeder Prozedur steht die Zeile

End Sub


die VBA anzeigt, daß die Prozedur hier aufhört. In der nächsten Zeile kann eine weitere Prozedur beginnen.

Zwischen Beginn und Ende einer Prozedur befinden sich jene Codezeilen, in denen VBA wirklich "arbeitet", die sogenannten "Anweisungen".

Syntax

[Private | Public][Static] Sub Name [(ArgListe)] 
        [Anweisungen]
        [Exit Sub]
        [Anweisungen]
End Sub


Elemente

Die Sub-Anweisung besteht aus folgenden Teilen:

Teil Beschreibung
Public Auf die Sub-Prozedur kann von allen anderen Prozeduren in allen Modulen zugegriffen werden. Bei Verwendung in einem privaten Modul (mit einer Option Privat-Anweisung) kann auf die Prozedur nur innerhalb des Projekts zugegriffen werden.
Private Auf die Sub-Prozedur kann nur durch andere Prozeduren aus dem Modulblatt zugegriffen werden, in dem steht.
Static Die lokalen Variablen der Sub-Prozedur bleiben zwischen Aufrufen erhalten. Das Attribut Statisch wirkt sich nicht auf Variablen aus, die außerhalb der Sub-Prozedur deklariert wurden, auch wenn sie in der Prozedur verwendet werden.
Name Name der Sub-Prozedur, gemäß den Standardkonventionen für Namen von Variablen.
ArgListe Variablenliste mit den Argumenten, die an die Sub-Prozedur beim Aufruf übergeben werden. Mehrere Variablen werden durch Beistriche getrennt.
Anweisungen Eine beliebige Gruppe auszuführender Anweisungen im Rumpf der Sub-Prozedur.

Die Syntax für das Argument ArgListe ist:

[[Optional][ByVal | ByRef][ParamArray] Variablenname[( )] As Typ]


Die ArgListe besteht aus folgenden Teilen:

Teil Beschreibung
Optional Ein Argument muß nicht angegeben werden. Alle im Anschluß an Optional in ArgListe angegebenen Argumente müssen auch optional sein und mit dem Schlüsselwort Optional deklariert werden. Alle als Optional angegebenen Argumente müssen den Typ Variant haben. Optional kann überhaupt nicht verwendet werden, wenn ArgumentListe verwendet wird.

Hinweis In Ihrem Code können Sie mithilfe der Funktion IsMissing() überprüfend, ob ein optionales Argument übergeben worden ist.

ByVal Das Argument wird als Wert übergeben.
ByRef Das Argument wird als Referenz übergeben.
ParamArray Ist nur als letztes Argument in ArgListe zulässig und gibt an, daß das letzte Element ein als Optional deklariertes Datenfeld mit Variant-Elementen ist. Das Schlüsselwort ParamArray erlaubt die Angabe einer variablen Anzahl von Argumenten und darf nicht in Kombination mit den Schlüsselwörtern ByVal, ByRef oder Optional verwendet werden. Ein Beispiel dafür auf Seite 25.
Variablenname Name der Variablen, die das Argument repräsentiert, gemäß den Standardkonventionen für Namen von Variablen.
Typ Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp.

Aufruf

Der Aufruf einer Sub-Prozedur erfolgt durch Angabe des Prozedurnamens, gefolgt von der Argumentliste. Es empfiehlt sich aber, das Befehlswort "Call" vor den Prozedurnamen zu setzen-so weiß man immer, daß man eine Prozedur aufruft, und nicht ein VBA-Objekt.

Sub AufrufendeProzedur()
  Call AusgabeImTestfenster("Hallo Welt")
End Sub
Sub AusgabeImTestfenster(sText)
  Debug.Print sText
End Sub


Hinweis In der VBA-Hilfe finden Sie unter "Call" genauere Informationen zum Aufrufen von Sub-Prozeduren.

Beispiel für "Argumentliste"

Sub HauptProzedur()
iEingabe = 20
Call TochterProzedur(iEingabe, "Guten Morgen")
End Sub
Sub TochterProzedur(iText, sGrussformel)
End Sub


iEingabe: Zahl, deren Adresse im Computer-Speicher an die Variable "iText" in der Tochterprozedur weitergegeben wird. Wird "iZahl" verändert, so ändert auch "iEingabe" seinen Wert. ("Übergabe per Referenz".)

Guten Morgen: Da keine Variable, sondern ein Text, wird an "sGrussformel" der Text weitergegeben. ("Übergabe als Wert".)

Übergabe als Wert erzwingen

Variable und Datenfelder werden immer per Referenz übergeben, es sei denn, Sie ordnen die Übergabe als Wert an.

Sub TochterProzedur(byVal iText, sGrussformel)
End Sub


"ByVal" wird vor de Namen der Variablen in der auffangenden Prozedur gestellt. Damit geht der Zusammenhang zwischen "iEingabe" und "iText" verloren. Änderungen des Wertes von "iText" haben auf den Wert von "iEingabe" keine Auswirkung mehr.

Anmerkungen

Sub-Prozeduren sind standardmäßig Public, wenn sie nicht explizit mit Private festgelegt werden. Wird Static nicht angegeben, so bleiben die Werte lokaler Variablen zwischen den Aufrufen nicht erhalten.

Der gesamte ausführbare Code muß sich in Prozeduren befinden. Innerhalb einer Sub-Prozedur kann keine weitere Sub-Prozedur definiert werden.

Die Anweisung "Exit Sub" führt zum unmittelbaren Verlassen einer Sub-Prozedur. Die Programmausführung wird mit der Anweisung fortgesetzt, die auf die Anweisung mit dem Aufruf der Sub-Prozedur folgt. "Exit Sub"-Anweisungen können beliebig oft an beliebigen Stellen innerhalb einer Sub-Prozedur verwendet werden.

Im Gegensatz zu einer Function-Prozedur (die einen Wert zurückgibt) kann eine Sub-Prozedur nicht in einem Ausdruck verwendet werden.

Nicht möglich: Variable = Call EineProzedur Argument:=, ...

Möglich: Variable = EineFunktion (Argument:=, ...)

Variablen in Sub-Prozeduren können entweder explizit deklariert oder ohne Deklaration verwendet werden. Explizit (über Dim) in einer Prozedur deklarierte Variablen sind innerhalb dieser Prozedur immer lokal. Andere Variablen, die in einer Prozedur verwendet, aber dort nicht deklariert werden, sind auch lokal, sofern sie nicht bereits explizit auf einer höheren Ebene außerhalb der Prozedur deklariert wurden.

Vorsicht Eine Prozedur kann eine nicht explizit in der Prozedur deklarierte Variable zwar verwenden, aber es kann zu Namenskonflikten kommen, falls ein anderes auf Modulebene definiertes Element denselben Namen hat. Verwendet Ihre Prozedur eine nicht deklarierte Variable mit einem Namen, der dem Namen einer anderen Prozedur, Konstanten oder Variablen (auf Modulebene) entspricht, so wird die Variable als Referenz auf den Namen interpretiert, der auf Modulebene definiert wurde.

Hinweis Deklarieren Sie Variablen, um solche Konflikte zu vermeiden. Mit der Anweisung Option Explicit am Beginn eines Modulblattes oberhalb der ersten Prozedur können Sie die explizite Deklaration von Variablen erzwingen:

Option Explicit
Sub ErsteProzedur
  Dim ...
  ...
End Sub


Nicht bekannte Zahl von Argumenten übergeben

Angenommen, Sie können während des Programmierens nicht wissen, viewiele Argumente eine Prozedur zur Laufzeit des Programmes empfangen wird. In diesem Fall müssen Sie diese Argumente in einem Variant-Datenfeld als "Argumentliste" übergeben. Die Prozedur muß dann selbst die Anzahl und Bedeutung der Argumente herausfinden. Ein Beispiel:

Sub HauptProzedur()
  zeingabe = 20
  Call TochterProzedur(zeingabe, "Guten Morgen", "Guten Abend")
End Sub
Sub TochterProzedur(ParamArray AuffangendesDatenfeld())
  For zähler = LBound(AuffangendesDatenfeld) _
    To UBound(AuffangendesDatenfeld)
    MsgBox AuffangendesDatenfeld(zähler)
  Next
End Sub


Das Gleiche gilt für Funktionen.

Die VBA-Hilfe gibt eine vollständige Darstellung aller Aspekte des Verwendens von Prozeduren in VBA. Suchen Sie zunächst den Index-Eintrag "Prozedur" und wählen Sie dann aus den angebotenen Themen "Prozedur-Anweisung".

Funktionen

Eine Funktion ist eine selbständige Einheit von Anweisungen, die Argumente erhalten, eine Reihe von Anweisungen ausführen und die Werte der übergebenen Argumente ändern kann. Sie entspricht damit einer Prozedur, allerdings mit drei Unterschieden:

Im Gegensatz zu einer Sub-Prozedur kann eine Funktions-Prozedur auf der rechten Seite eines Ausdrucks verwendet werden. Dadurch läßt sich der Rückgabewert der Funktions-Prozedur genau so weiter verarbeiten wie der Rückgabewert einer integrierten Funktion, zum Beispiel Wurzel, Cos oder Zn. Der Rückgabewert wird durch Zuweisung an den Namen der Funktion bereitgestellt.

Der Aufruf einer Funktions-Prozedur innerhalb eines Ausdrucks erfolgt durch Angabe des Funktionsnamens, gefolgt von der Argumentliste in Klammern. Die Klammern müssen auch dann angegeben werden, wenn die Funktion keine Argumente hat.

Resultat=Funktionsprozedur ()
Resultat=Funktionsprozedur (Arg1, ... Argn)
Function Wochennummer(Prüfdatum As Date) As Variant
Dim ErsterJänner As Long
ErsterJänner = DateSerial(Year(Prüfdatum), 1, 1)
Wochennummer = Prüfdatum - ErsterJänner + WeekDay(ErsterJänner) - 2
Wochennummer = Fix(Wochennummer / 7 + 1)
End Function


Diese Funktion berechnet die Wochennummer eines übergebenen Datums. Das Datum kann als Datumszahl, als Text oder als Bezug auf eine Zelle, die ein Datum enthält, eingegeben werden. Und so wird diese Funktion eingesetzt:

LaufendeWoche = Wochennummer("4. April 1994")


Die folgende Übersicht zeigt Ihnen den grundsätzlichen Aufbau einer VBA-Funktion.

Syntax

[Public | Private][Static] Function Name [(ArgListe)][As Typ]
  [Anweisungen]
  [Name = Ausdruck]
  [Exit Function] 
  [Anweisungen]
  [Name = Ausdruck]
End Function


Elemente

Die Function-Anweisung besteht aus folgenden Teilen:

Teil Beschreibung
Public Die Funktion kann in jedem Modulblatt eines Projektes angesprochen werden..
Private Auf die Funktions-Prozedur kann nur durch andere Prozeduren aus dem Modul zugegriffen werden, in dem sie selbst steht.
Static Alle innerhalb der Funktion geschaffenen (lokalen) Variablen behalten nach Abarbeiten der Funktion ihren Wert bei
Name Name der Funktion, gemäß den Standardkonventionen für Namen von Variablen.
ArgListe Variablenliste mit den Argumenten, die an die Funktions-Prozedur beim Aufruf übergeben werden. Mehrere Variablen werden durch Beistriche voneinander getrennt.
Typ Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp. Datenfelder lassen sich (unabhängig von ihrem Typ) nicht zurückgeben, bei Variant-Werten, die ein Datenfeld enthalten, ist dies jedoch möglich.
Anweisungen Eine beliebige Gruppe auszuführender Anweisungen im Rumpf einer Funktions-Prozedur.
Ausdruck Rückgabewert der Funktion.

Die Syntax für das Argument ArgListe ist:

[Optional][ByVal | ByRef][ParamArray] Variablenname[( )][As Typ]


Die Teile von ArgListe sind:

Teil Beschreibung
Optional Ein Argument muß nicht angegeben werden. Alle im Anschluß an Optional in ArgListe angegebenen Argumente müssen auch optional sein und mit dem Schlüsselwort Optional deklariert werden. Alle als Optional angegebenen Argumente müssen den Typ Variant haben. Optional kann nicht verwendet werden, wenn ParamArray verwendet wird.
ByVal Das Argument wird als Wert übergeben.
ByRef Das Argument wird als Referenz übergeben.
ParamArray Ist nur als letztes Argument in ArgListe zulässig und gibt an, daß das letzte Element ein als Optional deklariertes Datenfeld mit Variant-Elementen ist. Das Schlüsselwort ParamArray erlaubt die Angabe einer variablen Anzahl von Argumenten und darf nicht in Kombination mit den Schlüsselwörtern ByVal, ByRef oder Optional verwendet werden. Ein Beispiel dafür wurde bereits auf Seite 25 gegeben.
Variablenname Name der Variablen, die das Argument repräsentiert, gemäß den Standardkonventionen für Namen von Variablen.
Typ Datentyp des an die Prozedur zu übergebenden Arguments. Zulässige Typen sind Boolean, Integer, Long, Currency, Single, Double, Date, String (nur Zeichenfolgen variabler Länge), Object, Variant, ein benutzerdefinierter Typ oder ein Objekttyp.

Rückgabe des Funktionsergebnisses

Funktionen berechnen etwas und stellen das Ergebnis der Berechnung dem Programm zur Verfügung. Innerhalb der Funktion müssen Sie das Rechenergebnis einer Variablen zuweisen, die den Namen der Funktions-Prozedur hat. Solche Zuweisungen sind beliebig oft an beliebigen Stellen innerhalb der Funktion möglich. Wenn dem Funktionsnamen kein Wert zugewiesen wurde, liefert die Funktion einen Standardwert: Eine numerische Funktion liefert 0, eine Zeichenfolgenfunktion liefert eine leere Zeichenfolge (""), und eine Funktion mit dem Rückgabetyp Variant liefert "Empty" ("Leer"). Eine Funktion, die eine Objektreferenz zurückgibt, liefert "Nothing" ("Nichts"), wenn dem Funktionsnamen (unter der Verwendung der Anweisung "Set") innerhalb der Funktion keine Objektreferenz zugewiesen wurde.

Ein Beispiel dafür auf Seite 26.

Die VBA-Hilfe gibt eine vollständige Darstellung aller Aspekte des Verwendens von Funktionen in VBA. Suchen Sie zunächst den Index-Eintrag "Funktion" und wählen Sie dann aus den angebotenen Themen "Funktion-Anweisung".

Gültigkeitsbereich von Prozeduren und Funktionen

Prozeduren und Funktionen sind standardmäßig Öffentlich, wenn sie nicht explizit mit Privat festgelegt werden. Wird (zusätzlich) Statisch angegeben, so bleiben die Werte lokaler Variablen zwischen den Aufrufen der Funktion oder Prozedur erhalten.

Hinweis  Damit Sie sicher auf Prozeduren und Funktionen in fremden Arbeitsmappen zugreifen können, müssen Sie in der Arbeitsmappe, in der Sie diese aufrufen, einen "Verweis" eintragen. Sie erreichen das Dialogfeld "Verweise" über das Menü "EXTRAS", Befehl "Verweise...". Dieser Befehl ist nur sichtbar, wenn ein Modulblatt aktiv ist!

Anweisungen

Eine Anweisung ist die kleinste Einheit von Code und Operatoren, die eine Aktion, Definition oder Deklaration ermöglichen. Beispiele dafür sind:

Wert1=5

Zuweisung eines Wertes an eine Variable
Produkt=Wert1*Wert2

Multiplikation zweiter Werte mit Hilfe des Operators "*"; Zuweisung des Ergebnisses an eine Variable
x=Application.Max(5,12)

Aufruf der EXCEL-Funktion "Max"; Übergabe zweier Werte; Zuweisung des Ergebnisses an eine Variable
Open "TESTDAT.XLS"


Anweisung, die Datei zu öffnen
Unterprozedur Wert1, Wert2


Starten einer Prozedur und Übergabe von zwei Werten an diese
y=MeineFunktion(a,b,c)

Aufrufen einer Funktion und Übergabe von drei Werten an diese; Zuweisen des Ergebnisses der Berechnungen innerhalb der Funktion an eine Variable
DIM MeineVariable As Integer


Deklaration eines Variablennamens und Zuweisen eines Datentyps an die Variable

Mehrere Anweisungen pro Zeile Dies ist zwar schlechter Programmierstil, weil es Code unübesichtlich macht, es ist aber möglich, wenn Sie nach jeder Anweisung einen Doppelpunkt setzen.

Wert1 = 5: Wert2 = 8: Produkt = Wert1 * Wert2


Anweisungen, die wegen ihrer Länge mehr als eine Zeile Code brauchen Setzen Sie an das Ende jeder Zeile, in der Sie die Anweisung nicht zu Ende schreiben konnten, ein Leerzeichen gefolgt von einem Unterstrich.

Unterprozedur Wert1, _
    Wert2


Variablen und Datentypen

In den Beispielen zum Abschnitt "Anweisungen" haben wir den Begriff "Variable" kennengelernt. Was ist das eigentlich?

Eine Variable ist eine Speicherstelle im Computer, die Daten aufnehmen kann, die von einem VBA-Programm erfragt und auch geändert werden können. Jede Variable hat einen eindeutigen Namen, der sie innerhalb ihres Gültigkeitsbereiches identifiziert. Die Namen von Variablen müssen mit einem Buchstaben beginnen; sie dürfen keine Leerzeichen enthalten:

Falsch: 5Zeilen Meine Variable 
Richtig: Fünf_Zeilen MeineVariable 

Die folgende Tabelle enthält die von Visual Basic unterstützten Datentypen sowie deren Speicherbedarf und Wertebereiche.

Datentyp Speicherbedarf Bereich
Boolean 2 Bytes True oder False (Zahl <>0 oder 0)
Integer 2 Bytes -32.768 bis 32.767.
Long(lange Ganzzahl) 4 Bytes -2.147.483.648 bis 2.147.483.647.
Single (Gleitkommazahl mit einfacher Genauigkeit) 4 Bytes -3,402823E38 bis -1,401298E-45 für negative Werte. 1,401298E-45 bis 3,402823E38 für positive Werte.
Double (Gleitkommazahl mit doppelter Genauigkeit) 8 Bytes -1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte. 4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte.
Currency (skalierte Ganzzahl) 8 Bytes -922.337.203.685.477,5808 bis 922.337.203.685.477,5807.
Date (für Datum und Zeit) 8 Bytes 01. Januar 100 bis 31. Dezember 9999.
Object 4 Bytes Beliebiger Verweis auf ein Objekt.
String (Zeichenfolge) 1 Byte pro Zeichen 0 bis ca. 2 Milliarden (ca. 65.535 in Microsoft Windows, Version 3.1 und niedriger)
String*Anzahl Maximal Anzahl von Zeichen
Variant 16 Bytes + 1 Byte für jedes Zeichen Numerische Werte im Bereich des Datentyps Doppelt oder ein beliebiger Text.
Benutzerdefiniert (mit Typ) Anzahl ist von den Elementen abhängig Der Bereich für jedes Element entspricht dem Bereich des zugehörigen Datentyps.

Deklaration und Gültigkeitsbereich von Variablen

Lokal-Nur in einer Prozedur oder Funktion sichtbar Wenn Sie eine Variable in einer Prozedur erzeugen:

Variable=Wertzuweisung


oder gleich unterhalb des Prozedur- oder Funktionskopfes ausdrücklich einrichten:

Sub EineProzedur()
  Dim Variable
End Sub


dann ist diese Variable "lokal", das heißt, Sie ist nur in dieser Prozedur "sichtbar". Verläßt Ihr Programm die Prozedur, wird die Variable im Computerspeicher gelöscht. Sie können aber festlegen, daß Ihre Variable in mehr als einer Prozedur sichtbar und ansprechbar ist.

Privat-In allen Prozeduren und Funktionen eines Modulblattes sichtbar wird eine Variable dann, wenn Sie sie am Beginn des Modulblattes-noch vor dem Beginn der ersten Prozedur-mit einer "Private"-Anweisung deklarieren:

Private Variable as Integer
Sub Hauptprozedur()
    Variable=Wertzuweisung
Ende Sub


Wird der Modul verlassen, wird die Variable im Computerspeicher gelöscht.

Wird in einer Prozedur oder Funktion eine Variable deklariert, die den selben Namen hat wie eine private Variable im selben Modulblatt, dann "verbirgt" diese Variable den Blick auf die modulweit gültige.

Private TagesDatum as Integer
Sub Hauptprozedur()
    Dim TagesDatum as Date 
    Variable=Wertzuweisung
Ende Sub


Die in "Hauptprozedur" geschaffene Variable "TagesDatum" hat mit der modulweit geschaffenen nichts zu tun. Die modulweit geschaffene Variable ist in "Hauptprozedur" aber nicht mehr sichtbar.

Öffentlich-In allen Prozeduren und Funktionen eines Projekts sichtbar, solange das zugehörige VBA-Programm läuft ist eine Variable dann, wenn Sie sie am Beginn eines Modulblattes-noch vor dem Beginn der ersten Prozedur-mit einer "Public"-Anweisung deklarieren:

Public Variable As Integer
Sub Hauptprozedur()
    Variable=Wertzuweisung
Ende Sub


Wird auf Modulebene eine gleichnamige Variable definiert, dann "verbirgt" diese Variable im ganzen Modulblatt den Blick auf die projektweit gültige. Wird in einer Prozedur oder Funktion eine gleichnamige Variable deklariert, dann "verbirgt" diese Variable den Blick auf eine gleichnamige modulweit oder projektweit gültige.

Ein "Projekt" umfaßt sämtlichen Code in sämtlichen Modulblättern, die für ein VBA-Programm angelegt worden sind.

Statische Variable

Mit der Anweisung Statisch in einer Funktion oder Prozedur deklarierte Variable behalten ihren Wert, solange das VBA-Programm läuft.

Static Username as String


Syntax

[Dim | Private | Public] Variablenname[([Indizes])][As Typ]


Elemente

Die Deklarations-Anweisung einer Variablen besteht aus folgenden Teilen:

Teil Beschreibung
Variablenname Name der Variablen, gemäß den Standardkonventionen für Namen von Variablen.
Indizes Bei Datenfelder die Anzahl der Element-Dimensionen und der Elemente pro Dimension.
Typ Datentyp der Variablen. Boolean, Integer, Long, Currency, Single, Double, Date, String, String * Anzahl (für Zeichenfolgen fester Länge), Object, Variant, ein anderer benutzerdefinierter Typ oder ein Objekttyp.

Anmerkungen

Wenn Sie keinen Daten- oder Objekttyp angeben, erhält die Variable standardmäßig den Datentyp Variant. Dieser Variablentyp kann Werte aller Datentypen und Verweise auf alle Objekttypen enthalten. Er braucht den meisten Speicherplatz und wird langsamer abgearbeitet als eine Variable, die einen konkreten Datentyp (String, Integer, Double, Date etc.) oder Objekttyp (Workbook, Range, Menubar etc.) hat.

Bei der Initialisierung wird numerischen Variablen der Wert 0 und Zeichenfolgen variabler Länge eine leere Zeichenfolge zugewiesen. Zeichenfolgen fester Länge werden mit Nullen aufgefüllt und Variant-Variablen werden mit Leer initialisiert. Alle Elemente einer Variablen mit einem benutzerdefinierten Typ werden genauso initialisiert wie Variablen entsprechenden Datentyps. Einer Variablen mit einer Referenz auf ein Objekt muß mit der Setze-Anweisung ein existierendes Objekt zugewiesen werden, bevor sie verwendet werden kann. Eine deklarierte Objektvariable hat vor dem Zuweisen eines Objekts den speziellen Wert Nothing, der anzeigt, daß die Variable auf kein Objekt verweist.

Hinweis Wenn Sie die Dim-Anweisung innerhalb einer Prozedur verwenden, sollten Sie sie an den Anfang der Prozedur stellen. Somit bleibt sie gut sichtbar.

Datenfelder

Datenfelder sind eine besondere Art von Variablen. Sie sind eine Menge aufeinanderfolgender indizierter (das heißt mit einer fortlaufender Nummer ansprechbarer) Elemente mit einem gemeinsamen Datentyp. Wenn Sie wollen, daß die einzelnen Elemente eines Datenfeldes verschiedene Datentypen aufnehmen können, dann deklarieren Sie das Datenfeld als Typ "Variant". Jedes Datenfeldelement wird durch eine eindeutige Indexnummer gekennzeichnet. Änderungen an einem Element bleiben ohne Wirkung auf die anderen Elemente. Datenfelder werden mit der "Dim"-, "Private" - oder "Public"-Anweisung deklariert.

Syntax

Dim Variablenname[([Indizes])][As Typ]


Indizes bestimmen die Dimensionen einer Datenfeldvariablen. Bis zu 60 Dimensionen gleichzeitig sind zulässig. Die Syntax für das Argument Indizes ist:

[Untergrenze To] Obergrenze [,[Untergrenze To] Obergrenze]


Die Anweisung "Option Base"

Das erste Element eines Datenfeld erhält standardmäßig den Index 0. Das ist oft unpraktisch-zum Beispiel, weil es in Tabellen weder Spalte noch Zeile 0 gibt. Mit der Anweisung

Option Base 1


am Beginn eines Modulblattes erreichen Sie, daß alle Datenfelder, die in diesem Modul geschaffen werden, als ersten Index 1 haben.

Beispiele

STARRE ANZAHL VON ELEMENTEN

Wenn Sie ein Datenfeld deklarieren und gleichzeitig die Anzahl seiner Elemente festlegen, dann kann die Größe des Datenfeldes während des Programmlaufes nicht verändert werden.

TagFeld ist ein Datenfeld mit Variant-Werten und 51 indizierten Elementen von 0 bis 50, vorausgesetzt, Option Base wurde für das aktuelle Modul auf 0 (Voreinstellung) gesetzt.

Dim TagFeld(50)


Matrix ist ein zweidimensionales Datenfeld mit ganzen Zahlen.

Dim Matrix(3,4) As Integer


TestMatrix ist ein dreidimensionales Datenfeld mit Werten vom Typ Double und explizit angegebenen Grenzen.

Dim TestMatrix(1 To 5,  4 To 9,  3 To 5) As Double


Geburtstag ist ein Datenfeld mit Datumsangaben und Indizes von 1 bis 10.

Dim Geburtstag(1 To 10) As Date


DYNAMISCHES FESTLEGEN DER ELEMENTEZAHL

Die Dim- , Private- oder Public-Anweisung in Kombination mit einem leeren Klammernpaar dient der Deklaration dynamischer Datenfelder. Nach einer solchen Deklaration können Sie mit der Redim-Anweisung innerhalb einer Prozedur die Anzahl der Dimensionen und Elemente definieren. Wenn Sie eine Dimension für eine Datenfeldvariable mit einer weiteren Deklaration ändern wollen und die Größe des Datenfelds bereits explizit mit einer Dim- , Private- oder Public-Anweisung festgelegt wurde, tritt ein Fehler auf.

Beispiele

TestFeld ist ein dynamisches Datenfeld. Es wird-ohne Festlegung der Zahl der Elemente-so deklariert:

Dim TestFeld() As Integer


Später wird im Code dann (innerhalb einer Prozedur oder Funktion) die Anzahl der Elemente festgelegt:

Redim TestFeld(5)  ' 5 Elemente reservieren.
For I = 1 To 5  ' 5 Schleifendurchläufe.
  TestFeld(I) = I  ' Datenfeld initialisieren.
Next I


Die folgende Anweisung ändert die Größe des Datenfelds und löscht die übernommenen (d.h. die ersten fünf) Elemente.

Redim TestFeld(10)  ' Größe auf 10 Elemente ändern.
For I = 1 To 10  ' 10 Schleifendurchläufe.
  TestFeld(I) = I  ' Datenfeld initialisieren.
Next I


' Die nächste Anweisung ändert die Größe des Datenfelds, löscht die Elemente aber nicht.

Redim Preserve TestFeld(15)  ' Größe auf 15 Elemente ändern.


Gültigkeitsbereich von Datenfeldern

Datenfelder, die mit "Public" auf Modulebene deklariert wurden, stehen allen Prozeduren und Funktionen in allen Modulen zur Verfügung. Datenfelder, die mit "Private" auf Modulebene deklariert wurden, stehen allen Prozeduren des Moduls zur Verfügung. Auf Prozedur- oder Funktionsebene deklarierte Datenfelder stehen nur innerhalb der sie umgebenden Prozedur oder Funktion zur Verfügung.

Wenn Sie keinen Datentyp angeben, erhält das Datenfeld standardmäßig den Datentyp Variant.

Bei der Initialisierung wird numerischen Datenfeldelementen der Wert 0 und Zeichenfolgen variabler Länge eine leere Zeichenfolge zugewiesen. Zeichenfolgen fester Länge werden mit Nullen aufgefüllt und Variant-Variablen werden mit "Empty" initialisiert.

Die "Array"-Funktion

Liefert einen Variant mit einem Datenfeld.

Syntax

Variant=Array(ArgListe)


ArgListe enthält eine durch Beistriche getrennte Liste mit einer unbestimmten Anzahl von Werten, die dem im Variant enthaltenen Datenfeld als Elemente zugewiesen werden. Werden keine Argumente angegeben, so erstellt die Funktion ein Datenfeld mit der Länge Null.

Dim A As Variant
A = Array(10,20,30)
B = A(2)


Hinweis Die untere Grenze für ein mit der Datenfeld-Funktion erstelltes Datenfeld ist durch die "Option Base"-Anweisung festgelegt. Gilt auf dem Modulblatt "Option Base 1" so enthält A(2) den Wert 20, bei "Option Base 0" den Wert 30.

Anmerkungen

Obwohl sich ein Variant mit einem darin enthaltenen Datenfeld konzeptionell von einem Datenfeld mit Elementen des Typs Variant unterscheidet, wird auf die Datenfeldelemente in derselben Weise zugegriffen. Der Zugriff auf ein Element eines Datenfelds erfolgt durch Angabe des Variablennamens mit einem nachfolgenden Klammernpaar, das die Indexzahl des gewünschten Elements enthält. Im vorangehenden Beispiel erstellt die erste Anweisung die Variable A als einen Variant. Die zweite Anweisung weist der Variablen A ein Datenfeld zu. Die letzte Anweisung verdeutlicht, wie das zweite Datenfeldelement einer anderen Variablen zugewiesen werden kann.

 

Datenfeld-Variant mit Inhalt eines Zellbereiches füllen

Liegt in "Tabelle1" ein zweitspaltiger Zellbereich vor, der in jeder Spalte eine Liste enthält:

und ordnen wir mittels VBA an:

Sub try()
  Dim vNamensEinträge As Variant
  vNamensEinträge = ThisWorkbook.Sheets("Tabelle1"). _
  Cells(1, 1).CurrentRegion
End Sub

so enthält der Variant "vNamensEinträge" ein zweidimensionales Datenfeld mit den Inhalten der Spalten des Zellbereiches:

Wert von Spalte "A" in Zeile "1" erfragen Dazu schreiben wir:

MsgBox vNamensEinträge(1,1)

Und bei der Frage nach dem Wert von Spalte "B" in Zeile "1":

MsgBox vNamensEinträge(1,2)

Anzahl der Elemente erfragen Die Zahl der Elemente 1. Ordnung (=Anzahl der Datenzeilen in der Tabelle) erfragen wir so:

MsgBox "Anzahl der Datenzeilen= " & UBound(vNamensEinträge)

Und die Anzahl der Elemente 2. Ordnung pro Element erster Ordnung so:

MsgBox "Anzahl der Datenspalten= " & UBound(vNamensEinträge, 2)

Hinweis Das niedrigste Element eines mit einem Zellbereich gefüllten Datenfeld-Variants ist immer Eins, auch wenn "Option Base 0" angeordnet wurde.

Den Code dieses Beispiels finden Sie im Verzeichnis "Beispiel" in der Datei "VARIANT.XLS".

Konstanten

Während Variable und Datenfelder ihre Werte ändern können, während ein VBA-Programm läuft, behalten Konstante ihren Wert unabänderlich. Jeder Versuch, ihnen einen neuen Wert zu geben, führt zu einer Fehlermeldung und zum Abbruch des Programmes.

Deklaration von Konstanten

Innerhalb einer Prozedur werden Konstante so eingerichtet:

Sub MeineProzedur()
  Const DATUMS_SPALTE=1
  ...
End Sub


Auf Modulebene richten Sie Konstante ein, indem Sie sie noch vor dem Beginn der ersten Prozedur oder Funtion mit dem Befehlswort "Private" deklarieren. Diese Konstanten sind dann in allen Prozeduren und Funktionen auf dem Modulblatt bekannt. Richten Sie in einer Prozedur oder Funktion eine gleichnamige Konstante ein, dann "vebirgt" diese die modulweit deklarierte:

Private Const DATUMS_SPALTE=1
Sub MeineProzedur()
  Cells(7, DATUMS_SPALTE).Select
End Sub


Global sichtbar ist eine Konstante dann, wenn Sie sie auf irgendeinem Modulblatt eines Projektes noch vor dem Beginn der ersten Prozedur oder Funtion mit dem Befehlswort "Public" deklarieren. Diese Konstanten sind dann in allen Prozeduren und Funktionen auf allen Modulblättern bekannt. Richten Sie auf einem Modulblatt eine private gleichnamige Konstante ein, so "verbirgt" sie gegenüber allen Funktionen und Prozeduren auf diesem Blatt die projektweit deklarierte. Richten Sie in einer Prozedur oder Funktion eine gleichnamige Konstante ein, dann überdeckt diese innerhalb der Prozedur oder Funktion die globale Konstante.

Public Const HOECHSTGRENZE=1000
Sub MeineProzedur()
  If iEinWert > HOECHSTGRENZE Then ...
End Sub


Hinweis Es hat sich eingebürgert, den Namen von Konstanten ausschließlich mit Großbuchstaben zu schreiben. Sie fallen damit in einem Codetext deutlich auf und es ist jederzeit klar, daß es sich nicht um eine Variable handelt.

Variablen werden üblicherweise mit Groß- und Kleinbuchstaben geschrieben.

Operatoren

Operatoren leisten die Arbeit, die VBA mit Werten oder Objekten durchführt. Wir unterscheiden:

Arithmetische Operatoren

* Multiplikation
/ Division
+ Addition
- Subtraktion
\ Division mit ganzzahligem Ergebnis; Nachkommastellen werden abgeschnitten
^ Potentieren
Mod Liefert den Rest des gerundeten Ergebnisses einer Division

Logische Operatoren

Eqv Übereinstimmung zweier Ausdrücke
Imp Logische Implikation zweier Ausdrücke
Not Logische Verneinung eines Ausdruckes
Or Entweder-Oder oder beide zweier Ausdrücke
And Logische Gleichheit zweier Ausdrücke
Xor Logische Ausschließung zweier Ausdrücke

Vergleichsoperatoren

Syntax

Ergebnis = Ausdruck1 VergleichsOperator Ausdruck2
Ergebnis = Objekt1 Is Objekt2
Ergebnis = Zeichenfolge Like Muster


Elemente

Vergleichsoperatoren bestehen aus den folgenden Teilen:

Teil Beschreibung
Ergebnis Beliebige numerische Variable
Ausdruck Beliebiger Ausdruck
VergleichsOperator Beliebiger Vergleichsoperator
Objekt1 Beliebiger Objektname
Objekt2 Beliebiger Objektname
Zeichenfolge Beliebiger Zeichenfolgenausdruck
Muster Beliebiger Zeichenfolgenausdruck oder Bereich von Zeichen

Die Operatoren Is und Like haben eine spezielle Bedeutung. Is untersucht, ob zwei Objekt-Variable auf das selbe Objekt zeigen (funktioniert in EXCEL 5.0 nicht).

Sub try()

Set Testobjekt = ThisWorkbook.Sheets(1)
Set Testobjekt3 = Application.Toolbars

Set TestObjekt2 = Testobjekt  ' Objektverweise zuweisen.
Set TestObjekt4 = Testobjekt
Set TestObjekt5 = Testobjekt3
EinTest = TestObjekt2 Is TestObjekt4  ' Liefert Wahr.
EinTest = TestObjekt5 Is TestObjekt4  ' Liefert Falsch.
EinTest = Testobjekt Is TestObjekt5  ' Liefert Falsch.

End Sub


Like gibt an, ob eine Zeichenfolge in einer anderen enthalten ist.

EinTest = "aBBBa" Like "a*a"  ' Liefert Wahr.
EinTest = "F" Like "[A-Z]"  ' Liefert Wahr.
EinTest = "F" Like "[!A-Z]"  ' Liefert Falsch.
EinTest = "a2a" Like "a#a"  ' Liefert Wahr.
EinTest = "aM5b" Like "a[L-P]#[!c-e]"  ' Liefert Wahr.
EinTest = "BAT123khg" Like "B?T*"  ' Liefert Wahr.
EinTest = "CAT123khg" Like "B?T*"  ' Liefert Falsch.


Hinweis  Beim Vergleich von deutschen Zeichenfolgen, die Umlaute enthalten, sowie von Zeichenfolgen, in denen einmal Großschreibung und das andere Mal Kleinschreibung vorliegt, liefert "Like" nur dann das richtige Ergebnis, wenn am Beginn des Modulblattes noch vor der ersten Prozedur oder Funktion "Option Compare Text" angeordnet wird.

Verkettungsoperatoren

+ Hängt zwei Zeichenketten aneinander; addiert zwei Zahlen
& Hängt zwei Zeichenketten aneinander; wandelt Zahl in Zeichenkette um

Objekte

VBA ist "objektorientiert", aber was heißt das konkret? Alles, was wir in EXCEL sehen, bestimmen, ändern, hinzufügen oder löschen können, sind "Objekte", die Eigenschaften haben und mit Methoden manipuliert werden können.

Mehr über Objekte im nächsten Kapitel des Skriptums.

Gültigkeitsbereich von Objekten

Objekte sind global sichtbar. Mehr über sie in den folgenden beiden Kapiteln.

Schlüsselwörter nach Aufgabenbereichen

In der VBA-Hilfe wird eine ausführliche Übersicht über alle Schlüsselwörter dieser Programmiersprache gegeben. Viele Hyptertext-Verknüpfungen machen Ihnen die Hilfeseiten zu den einzelnen Schlüsselwörtern zugänglich.

Die Schlüsselwörter-Übersicht finden Sie in der EXCEL-Online-Hilfe zu EXCEL 5.0 unter "Inhalt der Microsoft EXCEL-Hilfe"-"Programmieren mit Visual Basic"-"Schlüsselwörter nach Aufgabenbereichen", in der Hilfe zu EXCEL 7.0 im Register "Suchen" des Hilfe-Dialogfeldes nach Eingabe des Suchbegriffes "Schlüsselwörter".

vorheriges Kapitel Inhalt Hilfe Beispiele laden nächstes Kapitel

------------

Copyright © by JOANNEUM RESEARCH Forschungsgesellschaft mbH